home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Forever 4
/
Atari Forever 4.zip
/
Atari Forever 4.iso
/
PD_THEMA
/
EDITOREN
/
QED_397
/
SOURCEN
/
KURZEL.C
< prev
next >
Wrap
C/C++ Source or Header
|
1998-03-14
|
9KB
|
442 lines
#include "global.h"
#include "edit.h"
#include "file.h"
#include "icon.h"
#include "menu.h"
#include "obj.h"
#include "rsc.h"
#include "scroll.h"
#include "tasten.h"
#include "text.h"
#include "windows.h"
#include "kurzel.h"
/*
* Exportierte Variablen
*/
BOOLEAN krz_loaded;
/**************************************************************************/
#define MNAME_LEN 15
#define KRZ_MAX_LEN 8
typedef struct
{
UBYTE name[MNAME_LEN+1];
PATH file;
LONG y;
WORD x;
}MARKE, *MARKEP;
#define KRZ_LEN(col) (TEXT(col)[0])
#define KRZ_TXT(col) (TEXT(col)+1)
#define ERSATZ(col) (TEXT(col)+1+KRZ_MAX_LEN+1)
LOCAL RING kurz;
/* Sortierte Zeilen */
/* Am Anfang in umgedrehter Reihenfolge die Zeichen */
/* des Kürzel als Null-Terminierender String */
/* davor noch die länge des Kürzel (Pascalähnlich) */
/* 0 Kürzellänge, 1-9 Kürzel, ab der 10 Position der Ersatzstring */
LOCAL RING auto_kurz;
LOCAL MARKE Marken[5];
LOCAL PATH krz_name; /* Name der aktuellen Kürzeldatei, oder leer */
/***************************************************************************/
LOCAL VOID go_to_marke(WORD nr);
LOCAL WORD load_kurzel (VOID);
LOCAL VOID clr_kurzel (VOID);
LOCAL WORD add_kurzel (LINEP col);
/***************************************************************************/
BOOLEAN goto_line_dial (VOID)
{
WORD antw;
UBYTE s[12];
objc_setstring(pos, GZEILE, "");
Arrow_mouse();
antw = HndlDial(pos, 0, FALSE, NULL, NULL);
Last_mouse();
objc_getstring(pos, GZEILE, s);
if (antw == GOK && *s)
{
desire_x = 0;
desire_y = atol(s)-1;
return TRUE;
}
return FALSE;
} /* mgoto */
/***************************************************************************/
/* Verwaltung der Marken */
/***************************************************************************/
VOID del_marke(WORD nr)
{
MARKEP m;
UBYTE *str;
WORD len;
if (nr>=0 && nr<=4)
{
m = Marken + nr;
m->file[0] = EOS;
m->name[0] = EOS;
str = menu[MMARKE1+nr].ob_spec.free_string + 5;
len = MNAME_LEN;
while ((--len)>=0)
*str++ = ' ';
}
}
VOID set_marke(WORD nr, CONST UBYTE *name, PATH file, LONG y, WORD x)
{
MARKEP m;
UBYTE n[MNAME_LEN+1];
if (nr>=0 && nr<=4)
{
m = Marken+nr;
m->x = x;
m->y = y;
*(UBYTE*)COPYB(n,name,MNAME_LEN) = EOS;
strcpy(m->name, n);
strcpy(m->file, file);
if (n[0]==EOS)
file_name(m->file, n, FALSE);
fillup_menu(MMARKE1 + nr, n, 5);
}
}
VOID get_marke(WORD nr, UBYTE *name, PATH file, LONG *y, WORD *x)
{
if (nr>=0 && nr<=4)
{
MARKEP m;
m = Marken+nr;
*x = m->x;
*y = m->y;
strcpy(name,m->name);
strcpy(file,m->file);
}
else
{
name[0] = EOS;
file[0] = EOS;
}
}
VOID init_marken(VOID)
{
WORD i;
MARKEP m;
for (i=5,m=Marken; (--i)>=0; m++)
{
m->file[0] = EOS;
m->name[0] = EOS;
}
init_textring(&kurz);
init_textring(&auto_kurz);
}
VOID goto_marke(WORD nr)
{
PATH file;
UBYTE name[12];
LONG y;
WORD x, icon;
if (global_shift)
del_marke(nr);
else
{
get_marke(nr,name,file,&y,&x);
if (file[0]!=EOS)
{
icon = still_loaded(file);
if (icon<0)
icon = load_edit(file,FALSE,-1,-1,NULL);
if (icon>=0)
{
if (do_icon(icon,DO_OPEN)<0)
note(1, NOWINDOW);
desire_y = y;
desire_x = x;
Icon_edit(icon,DO_GOTO);
}
}
}
}
VOID config_marken(TEXTP t_ptr)
{
WORD antw;
PATH file;
UBYTE name[14];
LONG y;
WORD x, i;
select_objc(marken, MRK1, TRUE);
for (i=1; i<5; i++)
select_objc(marken, MRK1+i, FALSE);
for (i=0; i<5; i++)
{
get_marke(i, name, file, &y, &x);
objc_setstring(marken, MRKTXT1+i, name);
}
Arrow_mouse();
antw = HndlDial(marken, 0, FALSE, NULL, NULL);
Last_mouse();
if (antw == MRKOK)
{
for (i=0; i<5; i++)
if (get_select(marken,MRK1+i))
break;
objc_getstring(marken, MRKTXT1+i, name);
set_marke(i, name, t_ptr->filename, t_ptr->ypos, t_ptr->xpos);
}
}
/***************************************************************************/
/* Verwaltung der Kürzel */
/***************************************************************************/
VOID clr_kurzel(VOID)
{
free_textring(&kurz);
free_textring(&auto_kurz);
krz_loaded = FALSE;
}
VOID do_kurzel(TEXTP t_ptr, BOOLEAN online)
{
BOOLEAN set_pos, save_insert;
WORD xw, i, len;
UBYTE *str, buffer[KRZ_MAX_LEN+1];
LINEP col;
RINGP k;
if (online)
k = &auto_kurz;
else
k = &kurz;
if (ist_leer(k))
return;
xw = t_ptr->xpos;
if (xw == 0)
return;
str = TEXT(t_ptr->cursor_line)+xw;
i = 0;
len = min(xw,KRZ_MAX_LEN);
while (len>0) /* umdrehen */
{
buffer[i++] = *(--str);
len--;
}
buffer[i] = EOS; /* abschliessen */
/* longest Match */
for (col=FIRST(k); TRUE; NEXT(col))
{
if (IS_TAIL(col))
{
if (!online) /* wenn man Auto-Kürzel hat, pings sonst bei */
mybeep(); /* jedem Zeichen, das kein Kürzel ist! */
return;
}
len = strncmp(buffer,KRZ_TXT(col),KRZ_LEN(col));
if (len == 0)
break;
if (len > 0)
{
if (!online) /* dito. */
mybeep();
return;
}
}
/*
* Damit während der Kürzelexpandierung NICHT automatisch
* eingerückt wird, merken wir uns die Einstellung und schalten es ab!
* Kürzel, die mehrzeilig sind und mit Blanks/TABs beginnen, erscheinen
* sonst nicht korrekt.
*/
save_insert = t_ptr->loc_opt->einruecken;
t_ptr->loc_opt->einruecken = FALSE;
len = KRZ_LEN(col);
if (overwrite)
while ((--len)>=0) char_left(t_ptr);
else
while ((--len)>=0) char_bs(t_ptr);
str = ERSATZ(col);
set_pos = FALSE;
for (i=col->len-(KRZ_MAX_LEN+2); (--i)>=0; )
{
if (*str == '^' && i > 0 && str[1] == '^')
{
char_cr(t_ptr);
restore_edit(); /* sonst entstehen komische Effekte */
xw++;
str++;
i--;
}
else if (*str!='~' || set_pos) /* das erste '~'-Zeichen zählt */
{
char_insert(t_ptr, *str);
xw++;
}
else
{
set_pos = TRUE;
xw = 0;
}
str++;
}
if (set_pos)
while ((--xw)>=0) char_left(t_ptr);
/*
* Und wieder herstellen
*/
t_ptr->loc_opt->einruecken = save_insert;
}
/* return 1 : kein Speicher mehr => abbruch */
/* 0 : alles ok */
WORD add_kurzel(LINEP col)
{
WORD len, i;
UBYTE *str, buffer[260], *start;
LINEP c;
BOOLEAN online;
krz_loaded = TRUE;
if (col->len<2)
return(0);
if (col->len>MAX_LINE_LEN-KRZ_MAX_LEN)
return(0);
if (!ist_mem_frei())
return (1);
start = strchr(TEXT(col),'='); /* start zeigt auf Ersatztext */
if (start==NULL)
return(0);
start++;
/* WS am Anfang überspringen */
for (str=TEXT(col); *str==' ' || *str=='\t'; str++) ;
if (str[0]=='#' || str[0]=='=' ||
(str[0]=='*' && str[1]=='='))
return(0); /* Kommentarzeile oder kein Kurzel */
len = 0;
while (len<KRZ_MAX_LEN && *str!=' ' && *str!='\t' && *str!='=') /* Ende suchen */
{
len++; str++;
}
if (start[-2]=='*') /* auto. Kürzel */
{
online = TRUE;
if (*str=='=')
{
str--;
len--;
}
}
else
online = FALSE;
buffer[0] = len; /* vorne Länge */
i = 1;
while (len>0) /* umdrehen */
{
buffer[i++] = *(--str);
len--;
}
buffer[i] = EOS; /* abschliessen */
len = (short) strlen(start);
COPYB(buffer+KRZ_MAX_LEN+2,start,len);
len += (KRZ_MAX_LEN+2);
c = FIRST(&kurz);
if (ist_leer(&kurz))
INSERT(&c,0,len,buffer);
else
{
while (!IS_TAIL(c) && strcmp(KRZ_TXT(c),buffer+1)>0)
NEXT(c);
col_insert(c->vorg,new_col_w(buffer,len));
kurz.lines++;
}
if (online)
{
c = FIRST(&auto_kurz);
if (ist_leer(&auto_kurz))
INSERT(&c,0,len,buffer);
else
{
while (!IS_TAIL(c) && strcmp(KRZ_TXT(c),buffer+1)>0)
NEXT(c);
col_insert(c->vorg,new_col_w(buffer,len));
auto_kurz.lines++;
}
}
return(0);
}
WORD load_kurzel(VOID)
{
LONG anz;
RING t;
LINEP lauf;
WORD erg;
LineEnding dummy;
if (krz_name[0] == EOS)
return 0;
erg = 1;
init_textring(&t);
if (load_datei(krz_name, &t, FALSE, &dummy)==0)
{
anz = t.lines;
lauf = FIRST(&t);
if (anz)
{
clr_kurzel(); /* alte Kürzel löschen */
while ((--anz)>=0)
{
if (add_kurzel(lauf)) break;
NEXT(lauf);
}
}
erg = 0;
}
kill_textring(&t);
return erg;
}
VOID ch_kurzel(CONST UBYTE *name, BOOLEAN force_load)
{
if (name[0] == EOS)
{
clr_kurzel();
krz_name[0] = EOS;
return;
}
if ((strcmp(name, krz_name) != 0) || (force_load))
{
strcpy(krz_name, name);
load_kurzel();
}
}